home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-05 / pdclk139.zip / TBLBUILD.ASM < prev   
Assembly Source File  |  1992-05-11  |  21KB  |  1,175 lines

  1. ;========================================================================
  2.  
  3. ; Copyright (C) 1991 by Jan.Engvald@ldc.lu.se, see file COPYING.
  4.  
  5. InAdrArpa    db    7,"in-addr",4,"arpa",0
  6. Qtype        dw    0c00h
  7. Qclass        dw    0100h
  8. InAdrArpaLen    equ    $-InAdrArpa
  9.  
  10. k16        dw    16
  11. TblSize        dw    16
  12. TblSizeLast    dw    16*16
  13. TblActive    dw    0
  14. TblActLast    dw    0
  15. TblWrNext    dw    0
  16. TblIpProbe    dw    130+256*235, 56+256*0
  17. TblProbeNext    dw    0
  18. TblProbIntvl    dw    9
  19.  
  20. TmpTbl        dw    0, 0, 0, 0, 0, 0, 0
  21.  
  22. SegmData    equ    $
  23. SegIpHwTbl    dw    0
  24. SegHwIpTbl    dw    0
  25. SegmNamTbl    dw    0
  26. SegmNamTbl2    dw    0
  27. TableSegs    equ    ($-SegmData)/2
  28.  
  29. Handle        dw    -1
  30. if DEBUG
  31. NameHwTbl    db    "hwtbl.tmp", 0
  32. NameIpTbl    db    "iptbl.tmp", 0
  33. else
  34. NameHwTbl    db    "hwtbl.txt", 0
  35. NameIpTbl    db    "iptbl.txt", 0
  36. endif ; DEBUG
  37.  
  38. MsgTblSize    db    "Wrote 0    table entries, "
  39. MsgTblAct    db    "0    active this run.", CR, LF, '$'
  40.  
  41.  
  42. ;************************************************************************
  43. ;*        FindIn16Table
  44. ;*
  45. ;*    Input:         DS:SI = address of search string key (saved)
  46. ;*            AX = string length (saved)
  47. ;*            ES = table segment (saved)
  48. ;*            BX = table size in bytes
  49. ;*    Output:         ES:BX = table slot address of entry less or equal to key
  50. ;*            Zero flag if equal to key
  51. ;*    Destroys:    BX, flags
  52. ;*
  53. ;* Before use, the table must be filled with all ones, except slot 0 which
  54. ;* must be filled with zeros. Slot 0 may never be changed.
  55. ;************************************************************************
  56.  
  57. FindIn16Table    proc    near
  58.         push    cx
  59.         push    dx
  60.         push    di
  61.         push    bp
  62.         mov    bp,si
  63.         mov    dx,16            ; find enclosing 2**x size
  64.   FindLenLoop:
  65.         shl    dx,1
  66.         cmp    dx,bx
  67.         jb    FindLenLoop
  68.  
  69.         mov    bx,dx            ; start binary search
  70.   FindLess:
  71.         sub    bx,dx
  72.   FindGreater:
  73.         shr    dx,1            ; divide step by two
  74.         cmp    dx,16            ; step < slot size?
  75.         jb    FindDone
  76.  
  77.         add    bx,dx            ; position halfway
  78.  
  79.         mov    di,bx
  80.         mov    si,bp
  81.         mov    cx,ax
  82.         repe    cmpsb            ; compare strings
  83.         ja    FindGreater
  84.         jb    FindLess
  85.   FindDone:
  86.         mov    si,bp
  87.         pop    bp
  88.         pop    di
  89.         pop    dx
  90.         pop    cx
  91.         ret
  92. FindIn16Table    endp
  93.  
  94.  
  95.  
  96. ;************************************************************************
  97. ;*        GetHexNums
  98. ;************************************************************************
  99.  
  100. GetHexNums    proc    near
  101.   GetHexNum:
  102.         xor    dx,dx
  103.   GetHexDig:
  104.         lodsb
  105.         cmp    al,'0'
  106.         jb    GetHexEnd
  107.         cmp    al,'9'
  108.         ja    GetHexTst
  109.         sub    al,'0'
  110.         jmp    short GetHexConv
  111.   GetHexTst:
  112.         cmp    al,'a'
  113.         jb    GetHexEnd
  114.         cmp    al,'f'
  115.         ja    GetHexEnd
  116.         sub    al,'a'-10
  117.   GetHexConv:
  118.         cbw
  119.         add    ax,dx
  120.         mov    cx,ax
  121.         mul    k16
  122.         mov    dx,ax
  123.         jmp    short GetHexDig
  124.   GetHexEnd:
  125.         cmp    al,'-'
  126.         mov    ax,cx
  127.         stosb
  128.         je    GetHexNum
  129.         ret
  130. GetHexNums    endp
  131.  
  132.  
  133.  
  134. ;************************************************************************
  135. ;*        Ins16ByteSlot
  136. ;************************************************************************
  137.  
  138. Ins16ByteSlot    proc    near
  139.         mov    cx,TblSize
  140.         push    es
  141.         pop    ds
  142.         sub    cx,bx
  143.         mov    si,bx
  144.         sub    si,2
  145.         add    si,cx
  146.         mov    di,si
  147.         add    di,16
  148.         std
  149.         shr    cx,1
  150.         rep    movsw
  151.         cld
  152.         push    cs
  153.         pop    ds
  154.         ret
  155. Ins16ByteSlot    endp
  156.  
  157.  
  158.  
  159. ;************************************************************************
  160. ;*        FindHostInTbls
  161. ;************************************************************************
  162.  
  163. FindHostInTbls    proc    near
  164.         push    dx
  165.         push    ax
  166.  
  167.         mov    es,SegHwIpTbl
  168.         mov    bx,TblSize
  169.         mov    ax,10
  170.         mov    si,bp
  171.         call    FindIn16Table
  172.         jz    InitHwMatch
  173.  
  174.         add    bx,16
  175.         call    Ins16byteSlot
  176.         mov    si,bp
  177.         mov    cx,10/2
  178.         mov    di,bx
  179.         rep    movsw
  180.  
  181.         mov    ax,TblSize
  182.         stosw
  183.   InitHwMatch:
  184.         mov    es,SegIpHwTbl
  185.         mov    bx,TblSize
  186.         mov    ax,10
  187.         mov    si,bp
  188.         sub    si,4
  189.         call    FindIn16Table
  190.         jz    InitIpMatch
  191.  
  192.         add    bx,16
  193.         call    Ins16byteSlot
  194.         mov    si,bp
  195.         sub    si,4
  196.         mov    cx,10/2
  197.         mov    di,bx
  198.         rep    movsw
  199.  
  200.         mov    ax,TblSize
  201.         stosw
  202.                 mov     ax,'  '
  203.                 stosw
  204.   InitIpMatch:
  205.         pop    ax
  206.         pop    dx
  207.         ret
  208. FindHostInTbls    endp
  209.  
  210.  
  211.  
  212. ;************************************************************************
  213. ;*        TableInit
  214. ;************************************************************************
  215.  
  216. TableInit    proc    near
  217.         test    Argflags,MAKE_TABLE
  218.         jnz    TableInit2
  219.         ret
  220.   TableInit2:
  221.         mov    bx,(TableSegs-1)*2
  222.         mov    dx,cs
  223.         add    dx,1000h
  224.                 mov     ax,'  '                 ; NamTbl2 must be blanked
  225.   TableFF:
  226.         mov    word ptr SegmData[bx],dx
  227.         mov    es,dx
  228.         add    dx,1000h
  229.                 cmp     dx,PspTopMem            ; end of free memory?
  230.         jbe    TableFits
  231.  
  232.         mov    al,'M'-'0'
  233.         call    terminate
  234.   TableFits:
  235.                 mov     cx,08000h               ; prefill all 64 kb
  236.         xor    di,di
  237.         rep    stosw
  238.  
  239.         sub    bx,2
  240.                 mov     ax,0ffffh               ; IpHwTbl prefill
  241.         jns    TableFF
  242.  
  243.                 xor     ax,ax                   ; zerofill first slot
  244.         mov    es,SegIpHwTbl
  245.         mov    cx,16/2
  246.         xor    di,di
  247.         rep    stosw
  248.  
  249.         mov    es,SegHwIpTbl
  250.         mov    cx,16/2
  251.         xor    di,di
  252.         rep    stosw
  253.  
  254.         push    cs
  255.         pop    es
  256.  
  257.         mov    dx,offset NameHwTbl
  258.         mov    ax,3d02h
  259.         int    21h
  260.         jc    TabInitHw
  261.  
  262.         mov    bx,ax
  263.         mov    ah,3eh
  264.         int    21h
  265.         jmp    TabTstIp
  266.   TabInitHw:
  267.         mov    dx,offset NameHwTbl
  268.         xor    cx,cx
  269.         mov    ah,3ch
  270.         int    21h
  271.         jc    TabOpenErr
  272.   TabTstIP:
  273.         mov    dx,offset NameIpTbl
  274.         mov    ax,3d02h
  275.         int    21h
  276.         mov    Handle,ax
  277.         jnc    TabRdNext
  278.  
  279.         mov    dx,offset NameIpTbl
  280.         xor    cx,cx
  281.         mov    ah,3ch
  282.         int    21h
  283.         jc    TabOpenErr
  284.         jmp    TabRdClOK
  285.   TabOpenErr:
  286.         mov    al,'O'-'0'
  287.         call    terminate
  288.  
  289.   TabRdNext:
  290.         push    cs
  291.         pop    es
  292.         mov    bx,Handle
  293.         mov    cx,72
  294.         mov    dx,offset FileBuf
  295.         mov    ah,3fh
  296.         int    21h
  297.         jc    TabRdErr
  298.  
  299.         or    ax,ax
  300.         jz    TabRdEof
  301.  
  302.         mov    si,offset FileBuf
  303.         cmp    byte ptr [si],'Z'-040h
  304.         je    TabRdEof
  305.         mov    di,offset TmpTbl
  306.         mov    bp,di
  307.         call    GetIpNr
  308.         jnz    TabRdErr
  309.  
  310.         mov    si,offset FileBuf+53
  311.         call    GetHexNums
  312.         cmp    byte ptr [si],LF
  313.         jne    TabRdErr
  314.  
  315.         mov    si,bp
  316.         movsw
  317.         movsw
  318.  
  319.         add    bp,4
  320.         call    FindHostInTbls
  321.         je    InitDup
  322.  
  323.         mov    si,offset FileBuf+16
  324.         mov    di,TblSize
  325.         call    NamePut
  326.         add    TblSize,16
  327.   InitDup:
  328.         push    cs
  329.         pop    es
  330.         mov    byte ptr FileBuf+72,'$'
  331.  
  332.         mov    dx,offset FileBuf
  333.         mov    ah,9
  334.         int    21h
  335.         jmp    TabRdNext
  336.  
  337.   TabRdErr:
  338.         mov    al,'R'-'0'
  339.         call    terminate
  340.  
  341.   TabRdEof:
  342.         mov    bx,Handle
  343.         mov    ah,3eh
  344.         int    21h
  345.         jnc    TabRdClOK
  346.  
  347.         mov    al,'C'-'0'
  348.         call    terminate
  349.   TabRdClOK:
  350. if DEBUG eq 0
  351.         call    ProbeIpInit
  352. endif ; not DEBUG
  353.         call    CurrentTicks
  354.         mov    TblProbeNext,cx
  355.         mov    TblWrNext,cx
  356.         cmp    EchoTarget,0
  357.         jnz    TableInitRet
  358.         or    GenFlags,TBL_READY
  359.   TableInitRet:
  360.         ret
  361. TableInit    endp
  362.  
  363.  
  364.  
  365. ProbeIpInit    proc    near
  366.         mov    dx,MyNet
  367.         mov    ax,Mynet+2
  368.         mov    TblIpProbe,dx
  369.         inc    ah
  370.         mov    TblIpProbe+2,ax
  371.         ret
  372. ProbeIpInit    endp
  373.  
  374.  
  375.  
  376. ;************************************************************************
  377. ;*        TblProbe
  378. ;************************************************************************
  379.  
  380. TblProbe     proc    near
  381.         cmp    InSendAndW,0
  382.         jnz    TblProbeRet
  383.  
  384.         test    GenFlags,TBL_READY
  385.         jz    TblProbeRet
  386.  
  387.         call    CurrentTicks
  388.         mov    ax,cx
  389.         sub    ax,TblProbIntvl        ; 2 - 9 probes a second
  390.         sub    ax,TblProbeNext
  391.         js    TblProbeRet
  392.  
  393.         mov    TblProbeNext,cx
  394.  
  395.         mov    ax,cx
  396.         sub    ax,TblWrNext
  397.         js    TblWrLater
  398.  
  399.         add    cx,182*20        ; limit write to once in 200 s
  400.         mov    TblWrNext,cx
  401.  
  402.         mov    ax,TblSize
  403.         mov    dx,TblActive
  404.         cmp    dx,TblActLast
  405.         ja    TblProbeWr
  406.  
  407.         cmp    ax,TblSizeLast
  408.         jbe    TblWrLater
  409.   TblProbeWr:
  410.         mov    TblActLast,dx
  411.         mov    TblSizeLast,ax
  412.         call    TableWr
  413.   TblWrLater:
  414.         test    ArgFlags,TBL_PROBE
  415.         jnz    TblDoProbe
  416.   TblProbeRet:
  417.         ret
  418.  
  419.   TblDoProbe:
  420.         cmp    TblProbIntvl,2
  421.         jbe    TblProbMin
  422.         dec    TblProbIntvl
  423.   TblProbMin:
  424.  
  425.         mov    dx,TblIpProbe
  426.         mov    ax,TblIpProbe+2
  427.         cmp    ax,ArpTabIp2+2        ; end of subnet numbers?
  428.         jne    TblProbeMore
  429.         cmp    dx,ArpTabIp1+2
  430.         jne    TblProbeMore
  431.         call    ProbeIpInit
  432.   TblProbeMore:
  433.         call    BufAlloc
  434.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  435.         mov    [bx].dTickTimeout,0    ; don't wait
  436.         call    SendArpReq        ; send arp
  437.         call    BufRelease
  438.  
  439.         add    ah,1            ; increment IP #
  440.         adc    al,0
  441.         adc    dh,0
  442.         adc    dl,0
  443.         mov    TblIpProbe,dx
  444.         mov    TblIpProbe+2,ax
  445.         ret
  446. TblProbe    endp
  447.  
  448.  
  449.  
  450. ;************************************************************************
  451. ;*        DoTable
  452. ;************************************************************************
  453.  
  454. DoTable     proc    near
  455.         mov    di,[bx].dPtrPhys
  456.         mov    si,[di]
  457.         mov    dx,[di+2]
  458.         mov    ax,[di+4]
  459.         call    ArpFindHw
  460.         mov    [bx].dIdxHwDst,di
  461.  
  462.         mov    di,[bx].dPtrIp
  463.         mov    cx,[di].iArpOp
  464.         add    di,iArpMyHwAd
  465.         mov    bp,di
  466.         add    di,6
  467.         mov    dx,[di]
  468.         mov    ax,[di+2]
  469.         mov    [bp-4],dx
  470.         mov    [bp-4+2],ax
  471.         push    bx
  472.  
  473.         cmp    cx,0200h        ; ignore arp REPLIES from hosts
  474.         jne    DoTabUpdate        ; already known (probably a
  475.         cmp    [bx].dIdxHwDst,ARPMYIDX    ; proxy arp gateway)
  476.         jne    DoTabUpdate
  477.  
  478.         push    ax
  479.         mov    es,SegHwIpTbl
  480.         mov    si,bp
  481.         mov    ax,10
  482.         mov    bx,TblSize
  483.         call    FindIn16Table        ; this Hw+IP addr already known?
  484.         pop    ax
  485.         je    DoTabUpdate
  486.  
  487.         push    ax
  488.         mov    si,bp
  489.         mov    ax,6
  490.         mov    bx,TblSize
  491.         call    FindIn16Table        ; this Hw addr already known?
  492.         pop    ax
  493.         je    TableAnswered
  494.   DoTabUpdate:
  495.         call    FindHostInTbls
  496.         jne    TableAdd
  497.  
  498.         cmp    byte ptr es:[bx+12],' '
  499.         je    TableNew
  500.  
  501.         cmp    byte ptr es:[bx+12],'s'
  502.         jb    TablePending
  503.   TableNew:
  504.         mov    byte ptr es:[bx+12],'p'
  505.         inc    TblActive
  506.         jmp    short TableAsk
  507.   TablePending:
  508.         cmp    byte ptr es:[bx+12],'p'
  509.         jb    TableAnswered
  510.  
  511.         inc    byte ptr es:[bx+12]
  512.   TableAnswered:
  513.         push    cs
  514.         pop    es
  515.         pop    bx
  516.         jmp    TableRetRel
  517.  
  518.   TableAdd:
  519.         mov    byte ptr es:[bx+12],'p'
  520.         inc    TblActive
  521.         push    dx
  522.         push    ax
  523.         push    bx
  524.         mov    si,bp
  525.         add    si,6
  526.         mov    di,TblSize
  527.         mov    es,SegmNamTbl
  528.         call    PutIpNum
  529.         call    BlankUntil16
  530.         add    TblSize,16
  531.         pop    bx
  532.         pop    ax
  533.         pop    dx
  534.   TableAsk:
  535.         mov    TblProbIntvl,9        ; probe twice a second
  536.         mov    es,SegIpHwTbl
  537.         mov    cx,es:[bx+10]
  538.         push    cx            ; save name tbl idx
  539.  
  540.         push    cs
  541.         pop    es
  542.  
  543.         xor    ch,ch
  544.         mov    cl,dh
  545.         xor    dh,dh
  546.         push    dx
  547.         push    cx
  548.         mov    cl,ah
  549.         xor    ah,ah
  550.         push    ax
  551.         push    cx
  552.  
  553.         mov    di,offset FileBuf
  554.         mov    bl,4
  555.         mov    PutMinDigits,1
  556.   TableNumLoop:
  557.         mov    si,di
  558.         inc    di
  559.         pop    ax
  560.         call    PutNum
  561.         mov    [si],dl
  562.         dec    bl
  563.         jnz    TableNumLoop
  564.  
  565.         mov    si,offset InAdrArpa
  566.         mov    cx,InAdrArpaLen
  567.         rep    movsb
  568.  
  569.         mov    dx,1234h        ; tblbuild udp src port
  570.         pop    ax            ; NsId
  571.         mov    si,offset FileBuf    ; Ns question string
  572.         call    NsResolve        ; ask name for this #
  573.         pop    bx
  574.   TableRetRel:
  575.         call    BufRelease
  576.   TableRet:
  577.         ret
  578. DoTable     endp
  579.  
  580.  
  581.  
  582. ;************************************************************************
  583. ;*        BlankUntil16 byte boundry
  584. ;************************************************************************
  585.  
  586. BlankUntil16    proc    near
  587.         mov    al,' '
  588.   BlankMore:
  589.         test    di,0fh
  590.         jz    BlankRet
  591.         stosb
  592.         jmp    short BlankMore
  593.   BlankRet:
  594.         ret
  595. BlankUntil16    endp
  596.  
  597.  
  598.  
  599. ;************************************************************************
  600. ;*        NamePut from DS:SI to TblName[DI]
  601. ;************************************************************************
  602.  
  603. NamePut     proc    near
  604.         mov    es,SegmNamTbl
  605.         mov    cx,16
  606.   NamePutLoop:
  607.         lodsb
  608.         cmp    al,CR
  609.         je    NamePutEnd
  610.         stosb
  611.         loop    NamePutLoop
  612.  
  613.         sub    di,16
  614.         mov    es,SegmNamTbl2
  615.         mov    cx,16
  616.   NamePutLoop2:
  617.         lodsb
  618.         cmp    al,CR
  619.         je    NamePutEnd2
  620.         stosb
  621.         loop    NamePutLoop2
  622.  
  623.   NamePutEnd2:
  624.         call    BlankUntil16
  625.         jmp    short NamePutRet
  626.  
  627.   NamePutEnd:
  628.         call    BlankUntil16
  629.  
  630.         mov    es,SegmNamTbl2
  631.         sub    di,16
  632.         stosb
  633.         jmp    short NamePutEnd2
  634.   NamePutRet:
  635.         push    cs
  636.         pop    es
  637.         ret
  638. NamePut     endp
  639.  
  640.  
  641.  
  642. ;************************************************************************
  643. ;*        ThisIpFirst
  644. ;*    Input:        DI = length prepended IP list
  645. ;*            BX = IP description buffer pointer
  646. ;*    Output:        Moves source IP # to front of IP list
  647. ;************************************************************************
  648.  
  649. ThisIpFirst    proc    near
  650.         mov    si,[bx].dPtrIp
  651.         mov    dx,[si].iIpSrc
  652.         mov    ax,[si].iIpSrc+2
  653.         mov    cl,-1
  654.         mov    ch,[di]            ; list length
  655.   ThisIpNext2:
  656.         inc    di
  657.         inc    di
  658.   ThisIpNext4:
  659.         inc    cl
  660.         cmp    cl,ch            ; more entries in list?
  661.         jae    ThisIpRet
  662.  
  663.         xchg    ax,dx
  664.         scasw                ; first IP word match?
  665.         xchg    ax,dx
  666.         jne    ThisIpNext2
  667.  
  668.         scasw                ; second IP word match?
  669.         jne    ThisIpNext4
  670.  
  671.         dec    di
  672.         lea    si,[di-4]
  673.         std
  674.         xor    ch,ch
  675.         shl    cx,1
  676.         rep    movsw            ; move entries downlist
  677.         cld
  678.         inc    si
  679.         mov    [si],dx            ; insert src IP in front
  680.         mov    [si+2],ax
  681.   ThisIpRet:
  682.         ret
  683. ThisIpFirst    endp
  684.  
  685.  
  686. ;************************************************************************
  687. ;*        DoName
  688. ;************************************************************************
  689.  
  690. DoName        proc    near
  691.         test    GenFlags,TBL_READY
  692.         jnz    NameInited
  693.  
  694.         ret
  695.   NameInited:
  696.         lea    si,[di].uNsQuest
  697.         mov    bp,[di].uNsId
  698.         lea    di,[di].uNsNscount
  699.         mov    dx,si
  700.         inc    dx
  701.  
  702.   BS        equ    'H'-040h
  703.         call    NameDecode
  704.         mov    word ptr [si],'  '
  705.         mov    word ptr [si+2],BS+256*BS
  706.         add    si,4
  707.  
  708.         push    dx
  709.         push    si
  710.         mov    si,dx
  711.         call    GetIpNr
  712.         pop    si
  713.         pop    dx
  714.  
  715.         mov    di,[bx].dPtrUdp
  716.         cmp    [di].uNsAncount,0100h
  717.         je    NameHaveAns
  718.         push    dx
  719.         jmp    short NameNoAnswer
  720.   NameHaveAns:
  721.         mov    di,si
  722.         call    NameDecode
  723.         jnz    NameDcCompr
  724.         mov    dx,di
  725.         inc    dx
  726.   NameDcCompr:
  727.   TAB        equ    'I'-040h
  728.         push    dx
  729.         mov    word ptr [si],TAB+256*'N'
  730.         mov    word ptr [si+2],'ma'
  731.         mov    word ptr [si+4],'0e'
  732.         mov    word ptr [si+6],'00'
  733.         mov    word ptr [si+8],'=0'
  734.         lea    di,[si+5]
  735.         add    si,10
  736.         mov    ax,bp
  737.         mov    cl,4
  738.         shr    ax,cl
  739.         mov    PutMinDigits,4
  740.         call    PutNum
  741.         mov    PutMinDigits,2
  742.  
  743.         mov    di,si
  744.         call    NameDecode
  745.   NameNoAnswer:
  746.         mov    word ptr [si],' '+256*CR
  747.         mov    word ptr [si+2],LF+256*'$'
  748.  
  749.         mov    si,[bx].dPtrUdp
  750.         mov    ax,[si].uNsNScount
  751.         mov    dx,[si].uNsNscount+2
  752.         xchg    ah,al
  753.         xchg    dh,dl
  754.         mov    [si].uNsNScount,dx
  755.         mov    [si].uNsNScount+2,ax
  756.         lea    si,[si].uNsNScount
  757.         push    bx
  758.         mov    bx,TblSize
  759.         mov    es,SegIpHwTbl
  760.         push    ax
  761.         mov    ax,4
  762.         call    FindIn16Table
  763.         pop    ax
  764.         mov    si,bx
  765.         pop    bx
  766.         je    NameFound
  767.   NameNotFound:
  768.         pop    dx
  769.         mov    ah,9
  770.         int    21h
  771.         mov    al,'A'-'0'
  772.         call    Terminate
  773.   NameFound:
  774.         mov    cx,si
  775.   NameFindNxtHi:
  776.         cmp    bp,es:[si+10]
  777.         je    NameFoundThis
  778.         add    si,16
  779.         cmp    dx,es:[si]
  780.         jne    NameFindLower
  781.         cmp    ax,es:[si+2]
  782.         je    NameFindNxtHi
  783.   NameFindLower:
  784.         mov    si,cx
  785.   NameFindNxtLo:
  786.         sub    si,16
  787.         cmp    bp,es:[si+10]
  788.         je    NameFoundThis
  789.         cmp    dx,es:[si]
  790.         jne    NameNotFound
  791.         cmp    ax,es:[si+2]
  792.         jne    NameNotFound
  793.         jmp    short NameFindNxtLo
  794.   NameFoundThis:
  795.         mov    bp,[bx].dPtrUdp
  796.         mov    dx,[bp].uNsAncount
  797.         mov    ax,[bp].uNsOpwd
  798.         and    ah,0fh
  799.         cmp    ah,1            ; format error?
  800.         jne    NameFmtOK
  801.  
  802.         mov    al,'F'-'0'
  803.         call    terminate
  804.   NameFmtOK:
  805.         mov    byte ptr es:[si+12],'t' ; try again next time
  806.  
  807.         cmp    ah,2            ; temporary server problem?
  808.         je    NameSkipUpd
  809.  
  810.         test    al,4            ; authorititive answer?
  811.         jz    NameTryLater
  812.  
  813.         mov    byte ptr es:[si+12],'0' ; we ask no more about this #
  814.   NameTryLater:
  815.         or    ah,ah            ; any other error?
  816.         jnz    NameSkipUpd
  817.  
  818.         cmp    dx,0100h        ; any answer?
  819.         jne    NameSkipUpd
  820.  
  821.         mov    byte ptr es:[si+12],'N' ; we ask no more about this #
  822.         test    al,4            ; authorititive answer?
  823.         jz    NameNotAuth
  824.  
  825.         mov    byte ptr es:[si+12],'A' ; we ask no more about this #
  826.   NameNotAuth:
  827.         mov    si,es:[si+10]
  828.         xchg    si,di
  829.         inc    si
  830.         call    NamePut
  831.   NameSkipUpd:
  832.         push    cs
  833.         pop    es
  834.         pop    dx
  835.         mov    ah,9
  836.         int    21h
  837.  
  838.         or    Events,GOT_NSREPLY
  839.         mov    di,offset DefNsNum
  840.         call    ThisIpFirst        ; stick to this nameserver
  841.   NameRet:
  842.         ret
  843. DoName        endp
  844.  
  845.  
  846.  
  847. ;************************************************************************
  848. ;*        TabMarkGw
  849. ;************************************************************************
  850.  
  851. TabMarkGw    proc    near
  852.         mov    bx,TblSize
  853.         mov    ds,SegIpHwTbl
  854.   TabMarkLoop:
  855.         mov    si,bx
  856.         mov    dx,[si]
  857.         mov    ax,[si+2]
  858.         mov    cx,cs:DefGwyNum
  859.         mov    si,offset DefGwys
  860.         jcxz    TabGwyDone
  861.   TabGwyLoop:
  862.         cmp    ax,cs:[si+2]
  863.         jne    TabGwyNext
  864.         cmp    dx,cs:[si]
  865.         jne    TabGwyNext
  866.         mov    byte ptr [bx+13],'+'
  867.         jmp    short TabGwyDone
  868.   TabGwyNext:
  869.         add    si,4
  870.         loop    TabGwyLoop
  871.   TabGwyDone:
  872.         sub    bx,16
  873.         jns    TabMarkLoop
  874.  
  875.         mov    bx,cs:TblSize
  876.   TabDupLoop:
  877.         mov    si,bx
  878.   TabMarkHwLoop:
  879.         sub    si,16
  880.         js    TabDupNext
  881.  
  882.         mov    ax,[si+4+4]
  883.         cmp    ax,[bx+4+4]
  884.         jne    TabMarkHwLoop
  885.         mov    ax,[si+4+2]
  886.         cmp    ax,[bx+4+2]
  887.         jne    TabMarkHwLoop
  888.         mov    ax,[si+4]
  889.         cmp    ax,[bx+4]
  890.         jne    TabMarkHwLoop
  891.  
  892.         cmp    byte ptr [si+13],'+'
  893.         je    TabMarkHwDup
  894.  
  895.         mov    byte ptr [si+13],'>'
  896.         cmp    byte ptr [bx+13],'>'
  897.         je    TabMarkHwDup
  898.  
  899.         cmp    byte ptr [bx+13],'+'
  900.         je    TabMarkHwLoop
  901.  
  902.         mov    byte ptr [bx+13],'='
  903.         jmp    short TabMarkHwLoop
  904.  
  905.   TabMarkHwDup:
  906.         cmp    byte ptr [bx+13],'+'
  907.         je    TabMarkHwLoop
  908.  
  909.         mov    byte ptr [bx+13],'>'
  910.         jmp    short TabMarkHwLoop
  911.   TabDupNext:
  912.         sub    bx,16
  913.         jns    TabDupLoop
  914.  
  915.         push    cs
  916.         pop    ds
  917.         ret
  918. TabMarkGw    endp
  919.  
  920.  
  921. ;************************************************************************
  922. ;*        TabOpen
  923. ;************************************************************************
  924.  
  925. TabOpen     proc    near
  926.         mov    ax,3d02h
  927.         int    21h
  928.         mov    Handle,ax
  929.         jnc    TabOpenRet
  930.         mov    al,'B'-'0'
  931.         call    terminate
  932.   TabOpenRet:
  933.         ret
  934. TabOpen     endp
  935.  
  936.  
  937.  
  938. ;************************************************************************
  939. ;*        TabPutHw
  940. ;************************************************************************
  941.  
  942. TabPutHw    proc    near
  943.         mov    ds,cs:SegIpHwTbl
  944.         lea    si,[bx+4]
  945.         call    PutHwNum
  946.  
  947.         mov    ds,cs:SegIpHwTbl
  948.         cmp    byte ptr [bx+13],'>'
  949.         clc
  950.         jne    TabPutHwRet
  951.  
  952.         stc
  953.  
  954.   TabPutHwRet:
  955.         push    cs
  956.         pop    ds
  957.         ret
  958. TabPutHw    endp
  959.  
  960.  
  961.  
  962. ;************************************************************************
  963. ;*        TabPutName
  964. ;************************************************************************
  965.  
  966. TabPutName    proc    near
  967.         push    bx
  968.         mov    ds,cs:SegIpHwTbl
  969.         mov    bx,[bx+10]
  970.         mov    cx,8
  971.         mov    ds,cs:SegmNamTbl
  972.         mov    si,bx
  973.         mov    dl,[si]
  974.         rep    movsw
  975.         mov    cx,8
  976.         mov    ds,cs:SegmNamTbl2
  977.         mov    si,bx
  978.         rep    movsw
  979.         mov    ax,'# '
  980.         stosw
  981.  
  982.         pop    bx
  983.         push    bx
  984.         mov    ds,cs:SegIpHwTbl
  985.         mov    si,bx
  986.         mov    ah,[si+12]
  987.         cmp    ah,' '
  988.         je    TabPutNotActive
  989. ;*test        inc    cs:TblActive
  990.   TabPutNotActive:
  991.         cmp    dl,'0'
  992.         jb    TabPutKnown
  993.         cmp    dl,'9'
  994.         ja    TabPutKnown
  995.         mov    al,'-'
  996.   TabPutKnown:
  997.         mov    dx,[si]
  998.         mov    cx,[si+2]
  999.         cmp    dx,[si+16]
  1000.         jne    TabPutNeN
  1001.         cmp    cx,[si+16+2]
  1002.         jne    TabPutNeN
  1003.         mov    al,'='
  1004.   TabPutNeN:
  1005.         cmp    dx,[si-16]
  1006.         jne    TabPutNeP
  1007.         cmp    cx,[si-16+2]
  1008.         jne    TabPutNeP
  1009.         mov    al,'<'
  1010.   TabPutNeP:
  1011.         stosw
  1012.         mov    al,[bx+13]
  1013.         stosb
  1014.         pop    bx
  1015.         ret
  1016. TabPutName    endp
  1017.  
  1018.  
  1019.  
  1020. ;************************************************************************
  1021. ;*        TabPutIp
  1022. ;************************************************************************
  1023.  
  1024. TabPutIp    proc    near
  1025.         mov    ds,cs:SegIpHwTbl
  1026.         mov    si,bx
  1027.         call    PutIpNum
  1028.         ret
  1029. TabPutIp    endp
  1030.  
  1031.  
  1032.  
  1033. ;************************************************************************
  1034. ;*        TabWrLine
  1035. ;************************************************************************
  1036.  
  1037. TabWrLine    proc    near
  1038.         push    bx
  1039.         mov    cx,di
  1040.         mov    dx,offset FileBuf
  1041.         sub    cx,dx
  1042.         mov    bx,Handle
  1043.         mov    ah,40h
  1044.         int    21h
  1045.         jnc    TabWrOK
  1046.   TabWrErr:
  1047.         mov    al,'W'-'0'
  1048.         call    terminate
  1049.   TabWrOK:
  1050.         pop    bx
  1051.         ret
  1052. TabWrLine    endp
  1053.  
  1054.  
  1055.  
  1056. ;************************************************************************
  1057. ;*        TabClose
  1058. ;************************************************************************
  1059.  
  1060. TabClose    proc    near
  1061.         mov    byte ptr FileBuf,'Z'-40h
  1062.         mov    dx,offset FileBuf
  1063.         mov    cx,1
  1064.         mov    bx,Handle
  1065.         mov    ah,40h
  1066.         int    21h
  1067.         jc    TabWrErr
  1068.  
  1069.         mov    bx,Handle
  1070.         mov    ah,3eh
  1071.         int    21h
  1072.         jnc    TabHwClOK
  1073.  
  1074.         mov    al,'C'-'0'
  1075.         call    terminate
  1076.   TabHwClOK:
  1077.         ret
  1078. TabClose    endp
  1079.  
  1080.  
  1081.  
  1082. ;************************************************************************
  1083. ;*        TableWr
  1084. ;************************************************************************
  1085.  
  1086. TableWr     proc    near
  1087.         cmp    TblSize,16
  1088.         ja    TableExist
  1089.         ret
  1090.  
  1091.   TableExist:
  1092.         push    bx
  1093.  
  1094.         call    TabMarkGw
  1095.  
  1096.         mov    dx,offset NameIpTbl
  1097.         call    TabOpen
  1098.         mov    bx,16
  1099.   TabIpNext:
  1100.         mov    di,offset FileBuf
  1101.  
  1102.         call    TabPutIp
  1103.  
  1104.         call    BlankUntil16
  1105.  
  1106.         call    TabPutName
  1107.  
  1108.         push    cs:ArgFlags
  1109.         and    cs:ArgFlags, not LANW_TABLE
  1110.         call    TabPutHw
  1111.         pop    ArgFlags
  1112.  
  1113.         mov    ax,CR+256*LF
  1114.         stosw
  1115.  
  1116.         call    TabWrLine
  1117.  
  1118.         add    bx,16
  1119.         cmp    bx,TblSize
  1120.         jb    TabIpNext
  1121.  
  1122.         call    TabClose
  1123.  
  1124.         mov    dx,offset NameHwTbl
  1125.         call    TabOpen
  1126.         mov    bx,16
  1127. ;*test        mov    TblActive,0
  1128.   TabHwNext:
  1129.         mov    di,offset FileBuf
  1130.         call    TabPutHw
  1131.         pushf
  1132.  
  1133.         mov    al,' '
  1134.         stosb
  1135.         call    TabPutName
  1136.  
  1137.         call    TabPutIp
  1138.  
  1139.         push    cs
  1140.         pop    ds
  1141.         mov    ax,CR+256*LF
  1142.         stosw
  1143.  
  1144.         popf
  1145. ;*test        jc    TabPutHwSkip
  1146.  
  1147.         call    TabWrLine
  1148.   TabPutHwSkip:
  1149.         add    bx,16
  1150.         cmp    bx,TblSize
  1151.         jb    TabHwNext
  1152.  
  1153.         call    TabClose
  1154.  
  1155.         pop    bx
  1156.  
  1157.         mov    di,offset MsgTblSize+6
  1158.         mov    ax,TblSize
  1159.         mov    cl,4
  1160.         shr    ax,cl
  1161.         dec    ax
  1162.         call    PutNum
  1163.         mov    di,offset MsgTblAct
  1164.         mov    ax,TblActive
  1165.         call    PutNum
  1166.         mov    dx,offset MsgTblSize
  1167.         mov    ah,9
  1168.         int    21h
  1169.  
  1170.         ret
  1171. TableWr     endp
  1172.  
  1173. ;========================================================================
  1174.  
  1175.